package com.rent.common.pojo;


import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;

@Setter
@Getter
public class ResultJSON<T> implements Serializable {

    // 响应业务状态
    @ApiModelProperty(value = "响应业务状态")
    private Integer status;

    // 响应消息
    @ApiModelProperty(value = "响应消息")
    private String msg;

    // 响应中的数据
    @ApiModelProperty(value = "响应数据")
    private T data;


    public ResultJSON(Integer status, String msg, T data) {
        this.status = status;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 返回初始方法
     *
     * @param status 状态
     * @param msg    消息
     * @param data   数据
     * @return 结果
     */
    public static <T> ResultJSON<T> build(Integer status, String msg, T data) {
        return new ResultJSON<>(status, msg, data);
    }

    /**
     * 构造函数
     *
     * @return 结果
     */
    public static <T> ResultJSON<T> build(ResultCode code, T data) {
        return new ResultJSON<>(code.getCode(), code.getMessage(), data);
    }

    /**
     * 结果成功
     *
     * @param msg 消息
     * @return 结果
     */
    public static <T> ResultJSON<T> success(String msg, T data) {
        return build(ResultCode.SUCCESS.getCode(), msg, data);
    }

    /**
     * 结果成功
     *
     * @param msg 消息
     * @return 结果
     */
    public static <T> ResultJSON<T> success(String msg) {
        return success(msg, null);
    }

    /**
     * 结果成功
     *
     * @param data 数据
     * @return 结果
     */
    public static <T> ResultJSON<T> success(T data) {
        return success(ResultCode.SUCCESS.getMessage(), data);
    }

    /**
     * 结果成功
     *
     * @return 结果
     */
    public static <T> ResultJSON<T> success() {
        return success(ResultCode.SUCCESS.getMessage());
    }

    /**
     * 结果失败
     *
     * @param msg 消息
     * @return 结果
     */
    public static <T> ResultJSON<T> failure(String msg) {
        return build(ResultCode.FAILED.getCode(), msg, null);
    }

    /**
     * 操作失败
     */
    public static <T> ResultJSON<T> failure() {
        return failure(ResultCode.FAILED.getMessage());
    }


    /**
     * 结果失败 没有权限
     *
     * @return 结果
     */
    public static <T> ResultJSON<T> noAuth() {
        return build(ResultCode.FORBIDDEN.getCode(), ResultCode.FORBIDDEN.getMessage(), null);
    }


    // 未授权
    public static <T> ResultJSON<T> unauthorized(T data) {
        return build(ResultCode.UNAUTHORIZED.getCode(), ResultCode.UNAUTHORIZED.getMessage(), data);
    }

    // 未登录
    public static <T> ResultJSON<T> forbidden(T data) {
        return build(ResultCode.FORBIDDEN.getCode(), ResultCode.FORBIDDEN.getMessage(), null);
    }


}
